//
//  HBStatusViewModel.swift
//  sinaWeibo
//
//  Created by Beans on 16/6/26.
//  Copyright © 2016年 iceWorks. All rights reserved.
//

//

import UIKit

class HBStatusCellViewModel: NSObject {

    var model: HBStatusModel?
    init(model: HBStatusModel) {
        self.model = model
    }

    // MARK: - 数据处理
    // 头像
    var photoURL: NSURL? {
        if let urlString = model?.user?.profile_image_url {
            return NSURL(string: urlString)
        }
        return NSURL()
    }

    // 昵称
    var name: String? {
        return model?.user?.name
    }

    // 内容
    var content: String? {
        return model?.text
    }

    // vip
    var vipImage: UIImage? {
        if let level = model?.user?.mbrank {
            return UIImage(named: "common_icon_membership_level\(level)")
        }
        return UIImage()
    }

    // 认证标志
    /// 认证类型 -1：没有认证，0，认证用户，2,3,5: 企业认证，220: 达人
    var verifyImage: UIImage? {
        if let type = model?.user?.verified_type {
            switch type {
            case -1   : return UIImage()
            case 0    : return UIImage(named: "avatar_grassroot")
            case 2,3,5: return UIImage(named: "avatar_enterprise_vip")
            case 220  : return UIImage(named: "avatar_vip")
            default   : return UIImage()
            }
        }
        return UIImage()
    }

    // 转发
    var repostCountStr: String? {
        if model?.reposts_count == 0 {
            return "转发"
        } else {
            return "\(model?.reposts_count ?? 0)"   // 解包, 不然会是`optional(11)`
        }
    }

    // 评论
    var commentCountStr: String? {
        if model?.comments_count == 0 {
            return ""
        } else {
            return "\(model?.comments_count ?? 0)"
        }
    }

    // 点赞
    var attitudeCountStr: String? {
        if model?.attitudes_count == 0 {
            return ""
        } else {
            return "\(model?.attitudes_count ?? 0)"
        }
    }

    // 转发的内容
    var repostContent: String? {
        return model?.retweeted_status?.text
    }

    // 来源字段
    var sourceString: String? {
        return dealSource(model?.source)
    }

    // 时间字段
    var createTimeString: String? {
        return dealCreateTime(model?.created_at)
    }

    // 处理后的微博内容
    // 原创微博
    var originalAttributeString: NSAttributedString? {
        return dealEmotionText(model?.text)
    }
    // 转发微博
    var repostAttributeString: NSAttributedString? {
        return dealEmotionText(model?.retweeted_status?.text)
    }

    // 来源字段的数据处理
    /*
    Optional("<a href=\"http://app.weibo.com/t/feed/6vtZb0\" rel=\"nofollow\">微博 weibo.com</a>")
    */
    private func dealSource(source: String?) -> String? {
        // 1. 根据字符来分割字符串
        let subSourceArr = source?.componentsSeparatedByString(">")
        // 2. 判断数组个数, 防崩溃
        if subSourceArr?.count >= 2 {
            // 3. 拿到索引为1的那个字符串
            let lastArr = subSourceArr![1].componentsSeparatedByString("<")
            // 4. 判断数组个数, 防崩溃
            if lastArr.count >= 1 {
                // 返回处理好的字符串
                return lastArr.first
            }
        }
        return ""
    }

    // 时间字段的数据处理
    private func dealCreateTime(createTime: String?) -> String? {
        guard let createTime = createTime else {
            return ""
        }

        /* Optional("Wed Jun 29 15:53:41 +0800 2016") */
        /** 对日期的处理:
            1> 转换为标准时间
            2> 通过日历, 与时间比较, 实现到达/发布/刚刚/多少分钟等效果
        */
        // 第一步
        let formatter = NSDateFormatter()
        // 设置格式
        formatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
        // 设置时区
        formatter.locale = NSLocale(localeIdentifier: "en_US")
        // 转换时间
        let createDate = formatter.dateFromString(createTime)
        printLog(createDate)

        // 第二步
        // 1. 获取日历对象
        let calendar = NSCalendar.currentCalendar()
        // 2. 要比较`.Year, .Month, .Day, .Hour, .Minute`的选项
        let unit = NSCalendarUnit(arrayLiteral: .Year, .Month, .Day, .Hour, .Minute)
        // 3. 对时间进行比较
        let cmps = calendar.components(unit, fromDate: createDate!, toDate: NSDate(), options: [])

        /** 显示逻辑
        如果是今年
            是今天
                1分钟之内 显示 "刚刚"
                1小时之内 显示 "xx分钟前"
                其他 显示 "xx小时前"
            是昨天 显示 "昨天 HH:mm"
            其他 显示 "MM-dd HH:mm"
        不是今年 显示 "yyyy-MM-dd"
        */
        
        // 判断是不是今年
        if cmps.year == 0 {                     // 今年
            if cmps.month == 0 {                // 本月
                if cmps.day == 0 {              // 今天
                    if cmps.hour == 0 {         // 1小时内
                        if cmps.minute == 0 {   // 刚刚
                            return "刚刚"
                        } else {                // 多少分钟内
                            return "\(cmps.minute)分钟前"
                        }
                    } else {                    // 其它小时
                        return "\(cmps.hour)小时前"
                    }
                } else if cmps.day == 1 {       // 昨天
                    // 需要对时间进行处理
                    // 时间格式化
                    formatter.dateFormat = "HH:mm"
                    // 返回格式化后的字符串
                    let str = formatter.stringFromDate(createDate!)
                    return "昨天 \(str)"
                } else {                        // 其他
                    formatter.dateFormat = "MM-dd HH:mm"
                    let str = formatter.stringFromDate(createDate!)
                    return "\(str)"
                }
            }
        } else {                                // 不是今年
            formatter.dateFormat = "yyyy-MM-dd"
            let str = formatter.stringFromDate(createDate!)
            return "\(str)"
        }

        return ""
    }

    // MARK: - 表情处理
    private func dealEmotionText(text: String?) -> NSAttributedString {
        // 1. 把表情的对象HBEmotion, 发送给publishVc
        // 2. 创建NSAttributeString, 拥有一个附件.NSTextAttachment, image
        // 3. textView的Attribute = attribute

        /*
        没有表情
        一个表情
        多个表情
        */

        guard let text = text else {
            return NSAttributedString()
        }

        // 定义一个全局AttributeString
        let globleAttribute = NSMutableAttributedString(string: text)       // 只走一次, 用string即可

        // 分析正则
        let pattern = "\\[.*?\\]"
        /*
        默认try(能捕获异常), try?, try!
        */
        do {
            // (1) 创建正则
            /* pattern: 正则表达式, options: 针对正则表达式的一些设置 */
            let regx = try NSRegularExpression(pattern: pattern, options: .DotMatchesLineSeparators)
            // (2) 匹配查找
            /* string: 指定查找的字符串 options: 默认值 range: 范围 */
            let results = regx.matchesInString(text, options: [], range: NSMakeRange(0, text.characters.count))

            // (3) 遍历查找结果 (反向查找, 防止数组越界)
            for (_,result) in results.reverse().enumerate() {
                // 获取查找结果的range
                let range = result.range
                // 通过range获取查找的表情字符串
                let emotionString = (text as NSString).substringWithRange(range)
                // 通过表情字符串转换成表情对象
                let emotion = HBEmotionManager.searchEmotion(emotionString)

                /*
                // 1> 创建一个附件
                let attachment = NSTextAttachment()
                // 2> 设置属性
                if let png = emotion?.png, path = emotion?.path {
                    let imageName = "\(path)/\(png)"
                    attachment.image = UIImage(named: imageName)
                }
                // 3> 赋值
                let attribute = NSAttributedString(attachment: attachment)
                */

                // (一) 调用抽取的对象方法
//                let attachment = HBTextAttachment()
//                attachment.emotion = emotion
//                let attribute = attachment.getAttributeString(UIFont.systemFontOfSize(16.0))

                // (二) 调用抽取的类方法
                let attribute = HBTextAttachment.getAttributeString(emotion, font: UIFont.systemFontOfSize(16.0))

                // 进行替换
                if let attribute = attribute {
                    globleAttribute.replaceCharactersInRange(range, withAttributedString: attribute)
                }
            }
            //遍历结束之后再返回
            return globleAttribute

        } catch {
            printLog(error)
        }

        return NSAttributedString()
    }
}
